import {
  env
} from '../env.config'
import HTTP from './http.js'

// 创建配置信息
const Config = {
  baseUrl: env.APP_BASE_URL, // 公共请求前缀（域名）
  timeout: 10 * 1000, // 请求超时时间
  loading: true // 是否启用pending状态的loading遮罩
}
// 初始化请求实例
const HttpClint = new HTTP(Config)

// 请求拦截配置项
const LoadingDelayTime = 300 // showLoading 延迟时间
let requestNum = 0 // 请求次数
let showLoading = false // loading 状态
let loadingTimer = null // showLoading 定时器
let RedirectTimer = null // 重新登录 定时器

// 请求拦截器
HttpClint.interceptor.request = config => {
  // 添加loading
  if (config.loading) {
    requestNum++
    // 请求队列中，第一个请求时，创建loading
    if (requestNum === 1) {
      loadingTimer = setTimeout(() => {
        showLoading = true
        wx.showLoading({
          title: 'loading...',
          mask: true
        })
      }, LoadingDelayTime)
    }
  }
  // 添加 Token 凭证
  if (typeof config.header !== 'object') config.header = {}
  config.header["Authorization"] = wx.getStorageSync('token')
  return config
}
// 响应拦截器
HttpClint.interceptor.response = response => {
  // 关闭 Loading
  if (response.loading) {
    requestNum--
    if (requestNum === 0) {
      if (loadingTimer) {
        clearTimeout(loadingTimer)
        loadingTimer = null
      }
      if (showLoading) {
        showLoading = false
        wx.hideLoading()
      }
    }
  }
  if (response.errMsg == 'uploadFile:ok') {
    let data = JSON.parse(response.data)
    return data.data
  }
  /* 以下是一个 响应统一处理 的示例，可以根据自己的场景业务进行修改 */
  if ([200, 201].includes(response.statusCode)) {
    if (response.data.code == 500) {
      wx.showToast({
        title: response.data.msg,
        icon: "none",
        duration: 2000
      })
      return ""
    }
    if (response.data.code == 200) {
      return response.data.data
    } else if (response.data.code == 401) {
      if (!wx.getStorageSync('environment')) {
        wx.login({
          success: res => {
            if (res.code) {
              // 发送 res.code 到后台换取 openId, sessionKey, unionId
              wx.request({
                method: 'POST',
                url: env.APP_BASE_URL + `/user/${env.login}`,
                data: {
                  code: res.code,
                  type: wx.getStorageSync('environment') ? '2' : '1'
                },
                success: res => {
                  wx.setStorage({
                    key: 'token',
                    data: res.data.data
                  })
                }
              })
            }
          }
        })
      } else {
        wx.qy.login({
          success: res => {
            if (res.code) {
              // 发送 res.code 到后台换取 openId, sessionKey, unionId
              wx.request({
                method: 'POST',
                url: env.APP_BASE_URL + `/user/${env.login}`,
                data: {
                  code: res.code,
                  type: wx.getStorageSync('environment') ? '2' : '1'
                },
                success: res => {
                  wx.setStorage({
                    key: 'token',
                    data: res.data.data
                  })
                }
              })
            }
          }
        })
      }
    } else if (response.data.code == 403) {
      wx.showToast({
        title: response.data.msg,
        icon: 'none'
      })
    } else if (response.data.code == 416) {
      setTimeout(() => {
        wx.showToast({
          title: '需要绑定手机后才能操作',
          icon: 'none'
        })
      }, 1000);
      let router = getCurrentPages()[0]
      wx.setStorageSync('backData', JSON.stringify({
        url: `${router.route}`,
        params: `${JSON.stringify(router.options)}`
      }))
      wx.switchTab({
        url: `/pages/me/me`
      })
    }
  } else {
    // 不是主动取消的请求给出提示
    if (response?.errMsg !== 'request:fail abort') {
      wx.showToast({
        title: '网络错误',
        icon: 'none'
      })
    }
    return false
  }
}

export default HttpClint